% 定义本书中使用到的格式

\ctexset {
  chapter = {
    pagestyle = headings,
  },
  section = {
     aftername={、},
  }
}

\usepackage{array}
\usepackage{mathtools} % 会自动加载宏包 'amsmath'
\allowdisplaybreaks[1]
\usepackage{amssymb}
\usepackage{bm}
\usepackage{calc}
\usepackage{caption}
\captionsetup[figure]{labelsep=none}
\usepackage{cases}

\usepackage{CJKfntef}
\usepackage{enumitem}
\usepackage{extarrows}
\usepackage{etoolbox}
\usepackage{float}
\usepackage[stable]{footmisc}
\usepackage{geometry}
\geometry{a4paper,left=2cm,right=2cm,top=2cm,bottom=1cm}

\usepackage{hyperref}
\hypersetup{colorlinks=true, linkcolor=red}

\usepackage{scalerel}

\usepackage{tabularray}
\UseTblrLibrary{counter}
\UseTblrLibrary{diagbox}
\UseTblrLibrary{siunitx}

\usepackage{tikz}
\usetikzlibrary{
  3d,
  arrows.meta,
  calc,
  decorations.pathreplacing,
  math,
  graphs,
  intersections,
  patterns,
  patterns.meta,
  positioning,
  quotes,
  shapes.geometric,
}
\usepackage{tikz-3dplot}

\usepackage{wrapfig}
\usepackage{xparse}
\usepackage{xpinyin}

% 确保 有行内公式 的行，与其上、下行之间，有足够的行距
% 参数1: 最后一行需要额外增加的高度（用于调整和后继行的间隔）
\NewDocumentEnvironment{enhancedline}{o}{
  \setlength{\lineskip}{\baselineskip-\ccwd}
  \setlength{\lineskiplimit}{2.5pt}
}{
  \IfValueT{#1}{
    \vspace{#1}
  }
  \par
}

% 绘制带圈的数字
\newcommand{\circled}[2][]{\tikz[baseline=(char.base)]
    {\node[shape = circle, draw, inner sep = 1pt]
    (char) {\phantom{\ifblank{#1}{#2}{#1}}};%
    \node at (char.center) {\makebox[0pt][c]{#2}};}}
\robustify{\circled}
\newcommand{\tc}[1]{\text{\circled{#1}}}

\counterwithout*{subsection}{section}
\counterwithin*{subsection}{chapter}
\setcounter{secnumdepth}{3}
\renewcommand{\thesection}{\chinese{section}}
\renewcommand{\thesubsection}{\arabic{chapter}.\arabic{subsection}}
\renewcommand{\thesubsubsection}{\arabic{subsubsection}.}

\renewcommand{\thefigure}{\thechapter-\arabic{figure}\;}
\renewcommand{\thetable}{\thechapter{}-\arabic{table}}
\renewcommand{\thefootnote}{\circled{\arabic{footnote}}}

% 在不改变 counter 值的情况下，重置 counter 的子 counter
\newcommand{\touchcounter}[1]{\stepcounter{#1} \addtocounter{#1}{-1}}

\newenvironment{starred}{
  \ctexset {
    chapter/name={*第,章},
    section/name={*},
    subsection/name={*},
  }
}{}


% 没有编号但又需要添加到目录中的 section (No num(ber) section)。
% 参数1: 目录中的文字（可选，如果没有指定，则使用参数2的值）
% 参数2: 正文中的文字
\NewDocumentCommand{\nonumsection}{o m}{%
  \touchcounter{section}
  \section*{#2}
  \IfNoValueTF{#1}
    {\addcontentsline{toc}{section}{#2}}
    {\addcontentsline{toc}{section}{#1}}
}

% 没有编号但又需要添加到目录中的 subsection (No num(ber) subsection)。
% 参数1: 目录中的文字（可选，如果没有指定，则使用参数2的值）
% 参数2: 正文中的文字
\NewDocumentCommand{\nonumsubsection}{o m}{%
  \touchcounter{subsection}
  \subsection*{#2}
  \IfNoValueTF{#1}
    {\addcontentsline{toc}{subsection}{#2}}
    {\addcontentsline{toc}{subsection}{#1}}
}


% （编号前）带星号的 subsection
% 参数1: subsection 的标题
% \NewDocumentCommand{\starredsubsection}{o m}{
%   \refstepcounter{subsection}
%   \subsection*{*\thesubsection\quad #2}
%   \IfNoValueTF{#1}
%     {\addcontentsline{toc}{subsection}{\makebox{*}\thesubsection\qquad #2}}
%     {\addcontentsline{toc}{subsection}{\makebox{*}\thesubsection\qquad #1}}
% }

\newcounter{cntliti}[subsection]           % 例题的计数器
\NewDocumentCommand{\liti}{o}{ % 例题的标题
  \IfNoValueTF{#1} {
    \stepcounter{cntliti}
    \textbf{例 \thecntliti}
  } {
    \textbf{例}
  }
  \;
}

\newcommand{\jie}{\textbf{解: }}
\newcommand{\zhengming}{\textbf{证明: }}

\newcommand{\lianxi}{%
  \vspace{1em}%
  {\large\textbf{练 \; 习}}\par
  \setcounter{cntxiaoti}{0}
}

\newcounter{cntxiti}               % “习题”的计数器
\newcommand{\xiti}{%
  \stepcounter{cntxiti}
  \vspace{1em}
  {\centering \section*{\labelxiti}}
}
\newcommand{\labelxiti}{习题 \chinese{cntxiti}}


\newcommand{\xiaojie}{%
  \nonumsection[\labelxiaojie]{\Large \labelxiaojie}
}
\newcommand{\labelxiaojie}{小 \hspace{2em} 结}


\newcounter{cntfuxiti}                       % “复习参考题”的计数器
\newcommand{\fuxiti}{%
  \stepcounter{cntfuxiti}
  \nonumsection[\labelfuxiti]{\Large \labelfuxiti}
}
\newcommand{\labelfuxiti}{复习参考题\chinese{cntfuxiti}}

\newcounter{cntxiaoti}[subsubsection]      % 小题的计数器
\newcounter{cntxiaoxiaoti}[cntxiaoti]      % 小小题的计数器
\counterwithin*{cntxiaoti}{cntxiti}
\counterwithin*{cntxiaoti}{cntfuxiti}
\counterwithin*{cntxiaoxiaoti}{cntliti}
\newcommand{\resetxxt}{\setcounter{cntxiaoxiaoti}{0}} % 重置 小小题的计数器

\newlength{\lenLabel}                     % 内部变量：用于计算题目前编号所占的长度
\newlength{\lenParent}                    % 内部变量：用于记录父题目编号所占的长度
\setlength{\lenParent}{0em}

\newenvironment{xiaotis}{% “小题” 环境
  \NewDocumentCommand \xiaoti {s m} {% 小题的标题
    \IfBooleanTF {##1}%
      {%
        \setlength{\lenLabel}{\widthof{\labelxiaoti}}%
        \hangafter 1\setlength{\hangindent}{\parindent + \lenLabel}{\hspace{\lenLabel}##2}%
      }%
      {%
        \stepcounter{cntxiaoti}%
        \setlength{\lenLabel}{\widthof{\labelxiaoti}}%
        \hangafter 1\setlength{\hangindent}{\parindent + \lenLabel}{\labelxiaoti ##2}%
      }%
  }%
  \newcommand{\labelxiaoti}{\arabic{cntxiaoti}. }% 1. 2. 3. ……
  \newenvironment{withstar}{%
    \renewcommand{\labelxiaoti}{*\arabic{cntxiaoti}. }% 1. 2. 3. ……
  }{%
  }
}{%
}

% 为命令 `\xiaoxiaoti' 增加一个可选参数，是为了实现：当“小题”没有文字时，第一个“小小题” 与“小题”同行。
% 对应 《代数二》“习题 十四” 中的第 10 小题。
% 在此之前，是通过将 “小小题” 上移一行来实现同行显示。如：《代数二》“习题 七” 中的第 10 小题。
% 但当“小题”本身处于页的最后一行时，上移不能生效，会导致“小题”显示在上一页的页末，而“小小题”显示在下一页的页首。
\newenvironment{xiaoxiaotis}{% “小小题” 环境
  \setlength{\lenParent}{\lenParent + \lenLabel}%
  \NewDocumentCommand{\xiaoxiaoti}{o m} {% 小小题的标题
    \stepcounter{cntxiaoxiaoti}%
    \setlength{\lenLabel}{\widthof{\labelxiaoxiaoti}}%
    \IfNoValueTF{##1}%
      {\hangafter 1\setlength{\hangindent}{\parindent + \lenParent + \lenLabel + 0.5em}{\hspace{\lenParent}~\labelxiaoxiaoti ##2}}%
      {\hangafter 1\setlength{\hangindent}{\parindent + \lenParent + \lenLabel + 0.5em}{~\labelxiaoxiaoti ##2}}%
  }%
  \newcommand{\labelxiaoxiaoti}{（\arabic{cntxiaoxiaoti}）}% （1） （2） （3） ……
  % 小小题 与 小题 同行时的默认缩进。调用形式为: \xiaoxiaoti[\xxtsep]{小小题的内容}
  \newcommand{\xxtsep}{0em}%
  \def\xxt{\xiaoxiaoti}%定义一个缩写。因为在表格中，如果总写 \xiaoxiaoti，字数太多。影响阅读。
}{%
}

\newcommand{\ewkh}[1][2em]{(\hspace{#1})}%英文括号
\newcommand{\xhx}[1][2em]{\CJKunderline{\hspace{#1}}}%下划线

\newcommand{\twoInLine}  [3][10em] {\begin{tabular}[t]{*{2}{@{}p{#1}}} #2 & #3\end{tabular}}
\newcommand{\threeInLine}[4][10em] {\begin{tabular}[t]{*{3}{@{}p{#1}}} #2 & #3 & #4\end{tabular}}
\newcommand{\fourInLine} [5][10em] {\begin{tabular}[t]{*{4}{@{}p{#1}}} #2 & #3 & #4 & #5\end{tabular}}

\newcommand{\twoInLineXxt}  [3][10em] {\begin{tabular}[t]{*{2}{@{}p{#1}}} \xiaoxiaoti{#2} & \xiaoxiaoti{#3}\end{tabular}}
\newcommand{\threeInLineXxt}[4][10em] {\begin{tabular}[t]{*{3}{@{}p{#1}}} \xiaoxiaoti{#2} & \xiaoxiaoti{#3} & \xiaoxiaoti{#4}\end{tabular}}
\newcommand{\fourInLineXxt} [5][10em] {\begin{tabular}[t]{*{4}{@{}p{#1}}} \xiaoxiaoti{#2} & \xiaoxiaoti{#3} & \xiaoxiaoti{#4} & \xiaoxiaoti{#5}\end{tabular}}


\newcommand{\jiange}{\vspace{0.5em}} % 手工调整垂直间隔（测试发现 0.5em 比较合适。不支持参数，特殊情况直接使用 \vspace{} 命令。）
\newcommand{\lianxijiange}{\vspace{2em}} % “练习” 与后继内容之间的间隔
\newcommand{\huitui}{\hspace*{-1em}} % 回退。

% 修改数学公式与上下文的距离
\makeatletter
\renewcommand\normalsize{%
    \abovedisplayskip 1\p@ \@plus1\p@ \@minus6\p@
    \belowdisplayskip \abovedisplayskip
}
\makeatother


%----------------------------------
\counterwithin*{equation}{subsection}
\renewcommand{\theequation}{\arabic{equation}}

\makeatletter
% 创建指定名字的标签
% 参数1: 标签的id
% 参数2: 标签的名字 (\nameref{标签id} 所得到的结果)
\newcommand{\namedlabel}[2]{%
  \@bsphack%
  \protected@write\@auxout{}{%
    \string\newlabel{#1}{%
        {\@currentlabel}%
        {\thepage}%
        {{#2}}%\@currentlabelname
        {\@currentHref}{}%
      }%
  }%
  \@bsphack%
}%
\makeatother

%----------------------------------
\newcounter{mylabel}
% 针对计数器 mylabel 创建（指定名字）标签
% 参数1: 标签的id
% 参数2: (可选) 标签的名字 (\nameref{标签id} 所得到的结果)。默认为标签归属章节的名字
\NewDocumentCommand{\mylabel}{m o}{%
  \refstepcounter{mylabel}%
  \IfValueTF{#2}{%
    \namedlabel{#1}{#2}%
  }{%
    \label{#1}%
  }%
}


%----------------------------------
% 实现类似如下效果：
%  name1 .............. value1
%  another-name2 .......... v2
\makeatletter
\newcommand \cdotfill {\leavevmode \cleaders \hb@xt@ .33em{\hss $\cdot$ \hss }\hfill \kern \z@}
\makeatother

\newenvironment{dottedlist}[2]{%
    \newcommand{\pair}[2]{\item ##1 \cdotfill ##2}
    \begin{itemize}[nosep, leftmargin=#1, rightmargin=#2]
        \renewcommand{\labelitemi}{}
}{%
    \end{itemize}
}


%---------------------------
\newcommand{\zhuyi}{\textbf{注意} \hspace{1em}}
\newcommand{\zhongdian}[1]{\textbf{#1}} % 重点（内容）

\newcommand{\shushi}[3]{% 竖式。
    % 注意，不要在 tblr 中调用此命令。只能在 tabular 中使用。
    \renewcommand\arraystretch{0.8}
    $\begin{array}[t]{r@{\;}r@{\quad}r}
        && #1 \\[-0.3em]
        #2 &  \vstretch{1.1}{\big)}\mkern-7.3mu & #3 \\
        \cline{2-3}
    \end{array}$
}

% 分隔
% 主要用于实现将 ∵ （或 ∴）符号 与 居中的数学公式显示在同一行。
% 参数1: (可选) 右侧的宽度。缺省为 0.9\textwidth
% 参数2: 左侧要显示的内容。一般为 $\because$ 或 $\therefore$
% 参数3: 右侧要显示的（居中的）数学公式。
% 示例：
% \fenge{$\because$}{$$ \text{左边} \neq \text{右边} $$}
% \fenge{$\therefore$}{\begin{equation} a=b \end{equation}}
\newcommand{\fenge}[3][0.9\textwidth]{
  #2 \begin{minipage}{#1}
    #3
  \end{minipage}
}
\newcommand{\fengeYinwei}[1]{\fenge{$\because$}{$$#1$$}}
\newcommand{\fengeSuoyi}[1]{\fenge{$\therefore$}{$$#1$$}}


%------------------------
\NewTblrTheme{nocaption}{
  \DefTblrTemplate{caption}{default}{}
  \DefTblrTemplate{caption-tag}{default}{}
  \DefTblrTemplate{caption-sep}{default}{}
  \DefTblrTemplate{contfoot-text}{default}{未完待续}
  \DefTblrTemplate{conthead-text}{default}{（续表）}
}

